﻿using System;
using System.ComponentModel;
using System.Drawing.Design;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using ApplicationGenerator.BusinessModule.MetaElements;
using ApplicationGenerator.Forms.Forms;
using ApplicationGenerator.BusinessModule.Interfaces;
using ApplicationGenerator.Forms.Utilities;
using ApplicationGenerator.CommonModule;

namespace ApplicationGenerator.Forms.WebControls
{
    /// <summary>
    /// Klasa bazowa dla kontrolek, które potrzebują mieć ustawiony model oraz wymagają mapowania
    /// </summary>
    [DefaultProperty("Path")]
    [Serializable]
    public abstract class BaseMappedControl : BaseControl, IValidation
    {
        #region Fields
        /// <summary>
        /// Model dla kontrolki
        /// </summary>
        [NonSerialized]
        private IMetaModel _source;
        #endregion

        #region Properties

        /// <summary>
        /// Model dla kontrolki
        /// </summary>
        [Browsable(false)]
        public IMetaModel Source
        {
            get { return _source; }
            set { _source = value; }
        }

        /// <summary>
        /// Ścieżka do mapowanego pola
        /// </summary>
        [Category("Rozszerzone dane")]
        [DisplayName("Mapowane pole")]
        [Description("Pole z modelu, do którego zostanie przypisana wartość z tej kontrolki.")]
        [Editor(typeof(ModelHierarchyEditor), typeof(UITypeEditor))]
        public string Path
        {
            get;
            set;
        }

        #endregion

        #region IValidation Members

        /// <summary>
        /// Waliduje encję
        /// </summary>
        /// <param name="errorList">Lista błędów</param>
        /// <returns>Czy encja jest poprawna ?</returns>
        public virtual new bool IsValid(ApplicationGenerator.CommonModule.ErrorEntity errorList)
        {
            bool isValid = base.IsValid(errorList);
            if (Source == null)
            {
                errorList.ErrorStrings.Add("Należy ustawić model, z którego będzie wybrane pole dla kontrolki.");
                isValid = false;
            }

            if (string.IsNullOrEmpty(Path))
            {
                errorList.ErrorStrings.Add("Należy ustawić ścieżkę do pola mapowanego.");
                isValid = false;
            }
            else
            {
                if (!PathValidator.ValidatePath(Path))
                {
                    errorList.ErrorStrings.Add("Ścieżka do mapowanego pola jest nieprawidłowa.");
                    isValid = false;
                }
            }

            return isValid;
        }

        #endregion
    }
}
